package com.ruoyi.web.controller.minio;


import cn.dev33.satoken.annotation.SaIgnore;
import com.ruoyi.common.core.domain.R;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.time.ZonedDateTime;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * 文件上传
 *
 * @author tzx
 */
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/app")
public class MinIoController {
    @Resource
    private MinIoService minIoService;


    /**
     * 针对于前端的直接上传文件格式的接口
     *
     * @param file
     */
    @SaIgnore
    @PostMapping("/upload")
    public R<String> uploadToFile(@RequestParam("file") MultipartFile file) {
        String fileUrl = "";
        try {
            fileUrl = minIoService.upload(file);
        } catch (Exception ex) {
            throw new RuntimeException(ex);
        }
        return R.ok("操作成功", fileUrl);
    }

    /**
     * 针对于后端文件流的形式上传文件
     *
     * @param file
     */
    @PostMapping("/uploadToFileInputStream")
    public void uploadToFileInputStream(@RequestParam("file") MultipartFile file) {
        minIoService.uploadToFile(file);
    }

    /**
     * 获取 一定有效期的图片连接
     *
     * @param name 文件名称
     * @param time 时间 单位：天
     * @return
     */
    @GetMapping("/getFileUrl")
    public String getFileUrl(@RequestParam("name") String name, @RequestParam("time") int time) {
        return minIoService.getUrl(name, time, TimeUnit.DAYS);
    }

    /**
     * 获取 文件签名
     *
     * @param name 文件名称
     * @return
     */
    @PostMapping("/getPolicyUrl")
    public Map getPolicyUrl(@RequestParam("name") String name) {
        return minIoService.getPolicyUrl(name, ZonedDateTime.now());
    }

    /**
     * 获取 临时文件连接
     *
     * @param name 文件名称
     * @return
     */
    @PostMapping("/getTempFileUrl")
    public String getTempFileUrl(@RequestParam("name") String name, @RequestParam("time") int time) {
        return minIoService.getFileUrl(name, time, TimeUnit.DAYS);
    }
}

